package pe.edu.upc.dai.grupovictor.service.impl;

import java.sql.Connection;
import java.util.ArrayList;
import java.util.List;
import pe.edu.upc.dai.grupovictor.dao.InscripcionDao;
import pe.edu.upc.dai.grupovictor.dao.NotaCursoDao;
import pe.edu.upc.dai.grupovictor.dao.impl.InscripcionDaoImpl;
import pe.edu.upc.dai.grupovictor.dao.impl.NotaCursoDaoImpl;
import pe.edu.upc.dai.grupovictor.dao.util.ConnectionUtils;
import pe.edu.upc.dai.grupovictor.model.Alumno;
import pe.edu.upc.dai.grupovictor.model.Inscripcion;
import pe.edu.upc.dai.grupovictor.model.NotaCurso;
import pe.edu.upc.dai.grupovictor.model.ProgramaCurso;
import pe.edu.upc.dai.grupovictor.service.NotaCursoService;

public class NotaCursoServiceImpl implements NotaCursoService {

    private NotaCursoDao notaCursoDao;
    private InscripcionDao inscripcionDao;

    public NotaCursoServiceImpl() {
        notaCursoDao = new NotaCursoDaoImpl();
        inscripcionDao = new InscripcionDaoImpl();
    }

    public NotaCurso seleccionarPorCodigo(Long codigo) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public void insertar(List<NotaCurso> notas) {

        Connection connection = ConnectionUtils.getConnection();
        notaCursoDao.iniciarConnection(connection);
        inscripcionDao.iniciarConnection(connection);

        try {

            List<NotaCurso> notasExisten = new ArrayList<NotaCurso>();
            List<NotaCurso> notasNoExisten = new ArrayList<NotaCurso>();

            for (NotaCurso nota : notas) {
                System.out.println("consultado existencia....");
                System.out.println("\talumno: " + nota.getIdAlumno().getIdAlumno());
                System.out.println("\tseccion: " + nota.getIdSeccion().getIdSeccion());
                System.out.println("\ttipoEval: " + nota.getIdTipoEvaluacion().getIdTipoEvaluacion());
                NotaCurso notaExiste = notaCursoDao.getNotaAlumno(nota);
                if (notaExiste == null) {
                    System.out.println("\t NO existe");
                    notasNoExisten.add(nota);
                } else {
                    System.out.println("\t SI existe");
                    notaExiste.setNota(nota.getNota());
                    notasExisten.add(notaExiste);
                }
            }

            System.out.println("Se manda insertar " + notasNoExisten.size() + " notas de " + notas.size());
            notaCursoDao.insertar(notasNoExisten);
            System.out.println("Se manda actualiza " + notasExisten.size() + " notas de " + notas.size());
            notaCursoDao.actualizar(notasExisten);
            
            for (NotaCurso nota : notas) {
                Alumno alumno = nota.getIdAlumno();
                ProgramaCurso seccion = nota.getIdSeccion();

                List<NotaCurso> notasAlu = notaCursoDao.getNotasAlumno(alumno, seccion);
                Float notaFinal = 0F;
                Float suma = 0F;
                Float sumaPesos = 0F;

                for(NotaCurso notaAlu : notasAlu){
                    suma += notaAlu.getNota() * notaAlu.getPeso() / 100;
                    sumaPesos += notaAlu.getPeso() / 100;
                }

                notaFinal = suma / sumaPesos;

                Inscripcion inscrito = new Inscripcion();
                inscrito.setIdAlumno(alumno);
                inscrito.setIdSeccion(seccion);
                inscrito.setNotaFinal(notaFinal);
                inscrito.setNotaParcial(notaFinal);

                inscripcionDao.actualizar(inscrito);

            }

        } catch (Exception e) {
            e.printStackTrace();
            ConnectionUtils.rollback(connection);
            ConnectionUtils.closeConnection(connection);
        } finally {
            ConnectionUtils.commit(connection);
            ConnectionUtils.closeConnection(connection);
        }
    }

    public void actualizar(List<NotaCurso> notas) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public void eliminar(NotaCurso notaCurso) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public List<NotaCurso> seleccionarByAlumno(Alumno alumno) {
        throw new UnsupportedOperationException("Not supported yet.");
    }
}
